package 多线程;

import testJ.S;

import java.util.concurrent.atomic.AtomicIntegerArray;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @Author: 朱胜伟
 * @CreateTime: 2021-02-02 08:35
 * @Description: atomi类
 */
public class CASAtomi {
    public static void main(String[] args) {
        AtomicIntegerArrayTest();
    }
    public static void AtomicLongTest(){
        //Atomic通过CAS保证数据的原子性，通过volatile保证可见性
        //decrement 递减
        int i = 0;
        AtomicLong atomicLong = new AtomicLong(0);
//        atomicLong.addAndGet(1); //+n
        //相当于  --i
        System.err.println(atomicLong.decrementAndGet());
        //相当于  i--
        System.err.println(atomicLong.getAndIncrement());
        //相当于  i+=10 后返回i
        System.err.println(atomicLong.addAndGet(10));
        atomicLong.set(0);
        System.err.println(atomicLong.addAndGet(10));
        System.err.println(atomicLong.getAndSet(10));

//        System.err.println(atomicLong.get());
    }
    public static void AtomicIntegerArrayTest(){
        AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(10);
        //1)返回指定位置的元素
        System.out.println(atomicIntegerArray.get(0)); //返回下标为0的元素
        //2）设置指定位置的元素
        atomicIntegerArray.set(0,10); //将下标为0的元素设置为10
        //在设置数组元素的同时，返回元素的旧值
        System.out.println(atomicIntegerArray.getAndSet(0,20));
        //3)修改元素的值，把数组元素加上某个值
        System.out.println(atomicIntegerArray.getAndSet(0,10));//下标为0元素加10，返回旧值
        System.out.println(atomicIntegerArray.addAndGet(0,10));//下标为0元素加10，返回新值
        //4)CAS操作
        //如果数组中下标为0的元素，值为10，则将其修改为222,返回 boolean
        System.out.println(atomicIntegerArray.compareAndSet(0,10,222));
        //5)自增/自减操作
        System.out.println(atomicIntegerArray.decrementAndGet(0)); //相当于 --i[0]
        System.out.println(atomicIntegerArray.incrementAndGet(0)); //相当于 ++i[0]
    }

}
